x86: Fix S3 resume for HPET MSI IRQ case
authorWei Gang <gang.wei@intel.com>
Mon, 14 Feb 2011 10:41:12 +0000 (10:41 +0000)
committerWei Gang <gang.wei@intel.com>
Mon, 14 Feb 2011 10:41:12 +0000 (10:41 +0000)
Jan Beulich found that for S3 resume on platforms without ARAT feature
but with MSI capable HPET, request_irq() will be called in
hpet_setup_msi_irq() for irq already setup(no release_irq() called
during S3 suspend), so that always falling back to using
legacy_hpet_event.

Fix it by conditional calling request_irq() for 4.1. Planned to split
the S3 resume path from booting path post 4.1, as Jan suggested.

Signed-off-by: Wei Gang <gang.wei@intel.com>
Acked-by: Jan Beulich <jbeulich@novell.com>
xen/arch/x86/hpet.c

index d27a4d1c02693a604325f5b6a93fce8bc53ce148..af568a3708c5d7418f45b64f826e5b0d797e3727 100644 (file)
@@ -367,12 +367,20 @@ static int hpet_setup_msi_irq(unsigned int irq)
     int ret;
     struct msi_msg msg;
     struct hpet_event_channel *ch = &hpet_events[irq_to_channel(irq)];
+    irq_desc_t *desc = irq_to_desc(irq);
 
-    irq_desc[irq].handler = &hpet_msi_type;
-    ret = request_irq(irq, hpet_interrupt_handler,
-                      0, "HPET", ch);
-    if ( ret < 0 )
-        return ret;
+    if ( desc->handler == &no_irq_type )
+    {
+        desc->handler = &hpet_msi_type;
+        ret = request_irq(irq, hpet_interrupt_handler,
+                          0, "HPET", ch);
+        if ( ret < 0 )
+            return ret;
+    }
+    else if ( desc->handler != &hpet_msi_type )
+    {
+        return -EINVAL;
+    }
 
     msi_compose_msg(NULL, irq, &msg);
     hpet_msi_write(irq, &msg);